import json  # 用于处理 JSON 数据
import os  # 用于文件操作

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.options import Options
from selenium.webdriver.edge.service import Service
from selenium.webdriver.support.wait import WebDriverWait

# 设置 Edge WebDriver 的路径
edge_driver_path = "C:/xiaoyh/edge_driver/msedgedriver.exe"

# 设置 Edge 浏览器的选项
options = Options()
options.add_argument('--headless')  # 无头模式
options.add_argument('--disable-gpu')  # 禁用GPU加速
options.add_argument('--no-sandbox')  # 解决权限问题

# 启动 Microsoft Edge 浏览器
driver = webdriver.Edge(service=Service(edge_driver_path), options=options)

tab_list = [
    {
        "title": "热搜",
        "tab": "realtime"
    },
    {
        "title": "小说",
        "tab": "novel"
    },
    {
        "title": "电影",
        "tab": "movie"
    },
    {
        "title": "电视剧",
        "tab": "teleplay"
    },
    {
        "title": "汽车",
        "tab": "car"
    },
    {
        "title": "游戏",
        "tab": "game"
    }
]

# 定义写入 JSON 文件的方法
def write_to_json(data, filename):
    # 确保目录存在
    os.makedirs(os.path.dirname(filename), exist_ok=True)
    # 将数据写入 JSON 文件，确保中文不乱码，且缩进方便阅读
    with open(filename, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=4)
    print(f"数据已成功写入到 {filename}")


def get_list(tab, title):
    print(f"开始获取 {title}...")

    # 打开百度热搜页面
    driver.get("https://top.baidu.com/board?tab=" + tab)

    # 等待至少5个新闻项目加载（动态判断元素总数）
    WebDriverWait(driver, 10).until(
        lambda d: len(d.find_elements(By.XPATH,
                                      "//a[contains(@class, 'title_dIF3B ')]//div[contains(@class, 'c-single-text-ellipsis')]")
                      ) >= 5
    )

    # 获取所有新闻项目
    items_list = driver.find_elements(By.CLASS_NAME, "content_1YWBm")

    # 用于存储当前分类的所有新闻数据
    data_list = []

    # 记录当前分类数量
    count = 0

    for items in items_list:
        try:
            # 使用相对路径，定位当前 `items` 内的标题和链接
            title_name = items.find_element(By.XPATH,
                                            ".//a[contains(@class, 'title_dIF3B ')]//div[contains(@class, 'c-single-text-ellipsis')]").text
            title_link = items.find_element(By.XPATH, ".//a[contains(@class, 'title_dIF3B ')]").get_attribute("href")
            data_list.append({"title": title_name.strip(), "link": title_link.strip()})
            count += 1
        except Exception as e:
            print(f"无法获取 {title} 的部分数据: {e}")

    # 写入数据到 JSON 文件
    filename = f"output/selenium/baidu/{title}.json"  # 输出到 `output` 文件夹下，按分类命名
    write_to_json(data_list, filename)

    print(f"完成获取 {title}.")
    print(f"一共获取到 {count} 条 {title} 数据。")
    print("--------------------------------------------")


for item in tab_list:
    get_list(item["tab"], item["title"])

# 退出浏览器
driver.quit()